<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>作用域</title>
</head>
<body>
    
</body>
</html>
<script>
    //作用域是从最内部向外找的，找到window对象为止
    //就像小辈可以向长辈索要东西
    //函数执行之后 里面的变量就会从内存中删除
    // let a = '1212';
    // function count(){
    //     let total = 12;
    //     return a;
    // }
    // console.log(count());

    //函数每次调用的时候都会创建一个新的作用域
    // let site = '后盾人';
    // function a(){
    //     let hd = 'houdunren.com';
    //     function b(){
    //         let cms = 'hdcms.com';
    //         console.log(hd);
    //         console.log(site);
    //     }
    //     b();
    // }
    // a();

    //函数每次调用的时候都会创建一个新的作用域
    // let site = '后盾人';
    // function a(){
    //     let hd = 'houdunren.com';
    //     function b(){
    //         let cms = 'hdcms.com';
    //         console.log(hd);
    //         console.log(site);
    //     }
    //     b();
    // }
    // a();


    //如果子函数被使用的时候 父级环境将被保留
    // function hd(){
    //     let a = 1;
    //     return function(){
    //         let b = 1;
    //         return function(){
    //             console.log(++a)
    //         }
    //     }
    // }
    // let a = hd()();
    // a();
    // a();

    //构造函数也是很好的环境例子，子函数被外部使用父亲级别的环境将被保留
    // function User(){
    //     let a = 1;
    //     //因为这个匿名函数被使用了   所以执行完毕之后父环境将被保留
    //     this.show = function(){
    //         console.log(a++)
    //     }
    // }
    // let a = new User();
    // a.show();
    // a.show();

    // //跟城市一样   如果城市有人用就被保留   否则的话  就会被销毁
    // //这里也就很明显的说明了，只有在实例化对象的时候  才会开辟新空间    如果里面的子方法被使用了   就会被保留
    // let b = new User();
    // b.show();
    // b.show();

    //使用let/const 可以将变量声明在块级作用域中，放在新环境中   而不是全局
    //以后在全局定义变量的时候 使用var   在块中定义变量的时候  使用let / const 如果不希望进行改变，就使用const进行访问
    // {
    //     let a = 9;
    //     // console.log(a)
    // }
    //只能在块中访问
    // console.log(a)
    //使用var声明的变量在全局都是可以进行访问的
    // if(true){
    //     var i = 1;
    // }
    // console.log(i)


    //可以通过函数定时器来体验变量作用域的问题
    // for(let i = 0 ; i < 10 ; i++){
    //     console.log(i)
    // }


    // for(let i = 0 ; i < 10 ; i++){
    //     setTimeout(() => {
    //         console.log(i)
    //     },500);
    // }


    //在for循环中使用  let / const 会在每次迭代中是生成不同的变量
    // let arr = [];
    // for(let i = 0;i<10;i++){
    //     (function(i){
    //         arr.push(() => i);
    //     })(i);
    // }
    // console.log(arr[3]())

    let arr = [];
    for(let i = 0;i<10;i++){
        arr.push((()=>i));
    }
    console.log(arr[3]())

</script>